package com.example.managemyself.util;

import android.content.Context;
import android.util.Log;

import com.example.managemyself.data.model.DiaryEntry;
import com.example.managemyself.data.model.Task;
import com.example.managemyself.data.repository.DiaryRepository;
import com.example.managemyself.data.repository.RepositoryFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * 任务完成通知器
 * 当任务被标记为完成时，自动将其记录到当天的日记中
 */
public class TaskCompletionNotifier {
    
    private static final String TAG = "TaskCompletionNotifier";
    private static TaskCompletionNotifier instance;
    
    private DiaryRepository diaryRepository;
    private UserManager userManager;
    
    private TaskCompletionNotifier() {
        userManager = UserManager.getInstance();
    }
    
    public static synchronized TaskCompletionNotifier getInstance() {
        if (instance == null) {
            instance = new TaskCompletionNotifier();
        }
        return instance;
    }
    
    /**
     * 初始化通知器
     */
    public void init(Context context) {
        diaryRepository = new DiaryRepository(context);
    }
    
    /**
     * 通知任务完成
     * @param task 完成的任务
     */
    public void notifyTaskCompleted(Task task) {
        if (task == null || !task.isCompleted()) {
            return;
        }
        
        Log.d(TAG, "任务完成通知: " + task.getTitle());
        
        // 在后台线程处理
        new Thread(() -> {
            try {
                addTaskToDiary(task);
            } catch (Exception e) {
                Log.e(TAG, "添加任务到日记失败", e);
            }
        }).start();
    }
    
    /**
     * 将完成的任务添加到当天的日记中
     */
    private void addTaskToDiary(Task task) {
        if (diaryRepository == null) {
            Log.w(TAG, "DiaryRepository未初始化");
            return;
        }
        
        // 获取当前用户
        if (userManager.getCurrentUser() == null) {
            Log.w(TAG, "用户未登录，无法添加任务到日记");
            return;
        }
        
        int userId = userManager.getCurrentUser().getId();
        Date today = new Date();
        
        try {
            // 获取今天的日记
            DiaryEntry todayDiary = diaryRepository.getDiaryByDateAndUserIdSync(today, userId);
            
            if (todayDiary == null) {
                // 如果今天没有日记，创建一个新的
                todayDiary = new DiaryEntry();
                todayDiary.setUserId(userId);
                todayDiary.setDate(today);
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
                todayDiary.setTitle(dateFormat.format(today) + " 日记");
                todayDiary.setContent("");
            }
            
            // 构建任务完成记录
            StringBuilder taskRecord = new StringBuilder();
            SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm", Locale.getDefault());
            String completionTime = timeFormat.format(task.getCompletedDate() != null ? task.getCompletedDate() : new Date());
            
            taskRecord.append("\n✅ ").append(completionTime).append(" 完成任务: ").append(task.getTitle());
            if (task.getDescription() != null && !task.getDescription().trim().isEmpty()) {
                taskRecord.append(" - ").append(task.getDescription());
            }
            taskRecord.append(" [").append(task.getType()).append("]");
            
            // 检查是否已经记录过这个任务
            String currentContent = todayDiary.getContent();
            String taskIdentifier = "完成任务: " + task.getTitle();
            
            if (currentContent == null || !currentContent.contains(taskIdentifier)) {
                // 添加任务记录到日记内容
                String newContent = (currentContent != null ? currentContent : "") + taskRecord.toString();
                todayDiary.setContent(newContent);
                
                // 添加任务ID到完成任务列表
                todayDiary.addCompletedTask(String.valueOf(task.getId()));
                
                // 更新完成任务摘要
                updateCompletedTasksSummary(todayDiary);
                
                // 保存日记
                if (todayDiary.getId() == 0) {
                    // 新日记，插入
                    diaryRepository.insertDiaryEntry(todayDiary);
                    Log.d(TAG, "创建新日记并添加任务完成记录: " + task.getTitle());
                } else {
                    // 现有日记，更新
                    diaryRepository.updateDiaryEntry(todayDiary);
                    Log.d(TAG, "更新日记并添加任务完成记录: " + task.getTitle());
                }
            } else {
                Log.d(TAG, "任务已经记录在日记中，跳过: " + task.getTitle());
            }
            
        } catch (Exception e) {
            Log.e(TAG, "处理任务完成记录时出错", e);
        }
    }
    
    /**
     * 更新完成任务摘要
     */
    private void updateCompletedTasksSummary(DiaryEntry diary) {
        if (diary.getCompletedTaskIds() != null && !diary.getCompletedTaskIds().isEmpty()) {
            StringBuilder summary = new StringBuilder();
            summary.append("📋 今日完成任务 (").append(diary.getCompletedTaskIds().size()).append("个):\n");
            
            String content = diary.getContent();
            if (content != null) {
                // 从内容中提取任务完成记录
                String[] lines = content.split("\n");
                for (String line : lines) {
                    if (line.contains("✅") && line.contains("完成任务:")) {
                        summary.append(line.trim()).append("\n");
                    }
                }
            }
            
            diary.updateCompletedTasksSummary(summary.toString());
        }
    }
    
    /**
     * 批量通知任务完成（用于导入或批量操作）
     */
    public void notifyTasksCompleted(java.util.List<Task> completedTasks) {
        if (completedTasks == null || completedTasks.isEmpty()) {
            return;
        }
        
        Log.d(TAG, "批量任务完成通知: " + completedTasks.size() + " 个任务");
        
        // 在后台线程处理
        new Thread(() -> {
            for (Task task : completedTasks) {
                if (task.isCompleted()) {
                    try {
                        addTaskToDiary(task);
                        // 添加短暂延迟，避免过快的数据库操作
                        Thread.sleep(50);
                    } catch (Exception e) {
                        Log.e(TAG, "批量处理任务完成记录时出错: " + task.getTitle(), e);
                    }
                }
            }
        }).start();
    }
} 